package com.zwb.wallet.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zwb.wallet.dto.ResultDto;
import com.zwb.wallet.entity.R;
import com.zwb.wallet.entity.Wallet;
import com.zwb.wallet.entity.WalletDetails;
import com.zwb.wallet.service.UserService;
import com.zwb.wallet.service.WalletDetailsService;
import com.zwb.wallet.service.WalletService;
import com.zwb.wallet.vo.ConsumptionVo;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * @author 头发又黑又长
 * @Date 2023/2/28 19:17
 * @email zwb15083976291@163.com
 */

@RestController()
@RequestMapping("/wallet")
public class WalletController {

    /**
     * 1. 查询用户钱包余额
     * 2. 用户消费100元的接口
     * 3. 用户退款20元接口
     * 4. 查询用户钱包金额变动明细的接口
     */


    /*
    *2. 用户消费100元的接口
     * 3. 用户退款20元接口
    * TODO 需要做接口幂等性，可以使用redis做防重Token临牌
    *
    * 用法：前端在请求此接口之前，而外请求一个获取随机字符串的接口a，在接口a中，将随机字符串保存到redis中，
    * 当请求本接口时，携带上随机字符串，我们在执行业务操作的时候，去redis中进行查询，
    *  如果redis中存在这个随机字符串，那么则此次是第一次访问本接口，然后在redis中删除这个字符串，在执行接下来的业务逻辑，
    *  如果redis中不存在这个字符串,那么这次请求不是第一次访问，则抛弃
    *  注意：查询和删除这个操作，redis必须保证原子性操作
    * */
    @Resource
    private UserService userService;

    @Resource
    private WalletDetailsService walletDetailsService;

    @Resource
    WalletService walletService;

    /*
    查询用户钱包余额
    * */
    @GetMapping("/{userId}")
    public R<Wallet> balance(@PathVariable("userId") Integer userId) {

        Wallet wallet = walletService.findBalanceByUserId(userId);
        return new R<Wallet>(20000, "ok", wallet);
    }

    /*
     * 用户消费100元的接口
     * */
    @PostMapping("/{userId}/consumption")
    public R consumption(@PathVariable("userId") Integer userId,
                         @RequestBody ConsumptionVo consumptionVo) {
        ResultDto result = walletDetailsService.consumption(userId, consumptionVo);
        if (!result.getResult()) {
            return new R(20003, result.getMessage());
        }
        return new R(20000, result.getMessage());
    }

    /*
     * 用户退款20元接口
     * */
    @PostMapping("/{userId}/refund")
    public R refund(@PathVariable("userId") Integer userId,
                    @RequestBody ConsumptionVo consumptionVo) {
        ResultDto result = walletDetailsService.refund(userId, consumptionVo);
        if (!result.getResult()) {
            return new R(20003, result.getMessage());
        }
        return new R(20000, result.getMessage());
    }


    /**
     * 查询用户钱包金额变动明细的接口
     */
    @GetMapping("/{userId}/walletDetails")
    public R walletDetails(@PathVariable("userId") Integer userId,
                           @RequestParam(value = "size", defaultValue = "10") Integer size,
                           @RequestParam(value = "current", defaultValue = "1") Integer current

    ) {

        Page<WalletDetails> page = walletDetailsService.page(new Page<>(current, size),
                new LambdaQueryWrapper<WalletDetails>().eq(WalletDetails::getUserId, userId));
        return new R(20000, "ok", page);
    }
}
